// plugin_executor.cpp
#include "custom_type.hpp"
#include "behaviortree_cpp/bt_factory.h"

class PrintVector : public BT::SyncActionNode
{
public:
  PrintVector(const std::string& name, const BT::NodeConfig& config)
    : BT::SyncActionNode(name, config)
  {}

  BT::NodeStatus tick() override
  {
    const auto v = getInput<Vector4D>("value").value();
    printf("x:%f  y:%f  z:%f  w:%f\n", v.x, v.y, v.z, v.w);
    return BT::NodeStatus::SUCCESS;
  }

  // It is mandatory to define this static method.
  static BT::PortsList providedPorts()
  {
    return { BT::InputPort<Vector4D>("value") };
  }
};

// Function used to register PrintVector automatically, when
// loading the plugin.
// Remember that it is mandatory to add to the CMakeLists.txt file this:
//
//    target_compile_definitions(<target_name> PRIVATE  BT_PLUGIN_EXPORT)
//
// 注册自定义节点到行为树工厂
//宏参数 factory 是一个 BehaviorTreeFactory 实例
//宏展开后，实际调用的是 BehaviorTreeFactory::registerNodeType<T>() 模板方法。
//使用宏，等价于// 每新增一个节点，需重复写 factory.registerNodeType
// BehaviorTreeFactory factory;
// factory.registerNodeType<SayHello>("SayHello");
// factory.registerNodeType<MoveTo>("MoveTo");

BT_REGISTER_NODES(factory)
{
  std::cout << "Registering nodes..." << std::endl;//在宏内添加调试信息或条件判断
  factory.registerNodeType<PrintVector>("PrintVector");
}
// #define BT_REGISTER_NODES(factory) \
//   BTCPP_EXPORT void BT_RegisterNodesFromPlugin(BT::BehaviorTreeFactory& factory)
// BT_REGISTER_NODES(factory): 这是一个宏，接受一个参数 factory
// 作用: 展开为一个函数声明，这个函数用于注册节点到工厂中
// 实际展开效果:
// BTCPP_EXPORT void BT_RegisterNodesFromPlugin(BT::BehaviorTreeFactory& factory)
// BTCPP_EXPORT是一个平台相关的导出宏，确保函数在动态库中可见，在 Linux/macOS 上可能展开为 __attribute__((visibility("default")))
// 函数名: BT_RegisterNodesFromPlugin - 这是固定的入口函数名
// 参数: BT::BehaviorTreeFactory& factory - 行为树工厂的引用
// 返回值: void


// 动态加载需求：
// BehaviorTree.CPP 支持将节点编译为动态库（插件），通过宏可以统一导出注册函数，供外部调用。例如：
// 插件导出函数
// extern "C" void __attribute__((visibility("default"))) RegisterNodes(BT::BehaviorTreeFactory& factory) {
//     BT_REGISTER_NODES(factory) {
//         factory.registerNodeType<SayHello>("SayHello");
//     }
// }
// 直接调用函数无法实现这种标准化接口

